rulesystem W with @COLLECTION {
  rule interlink_coarse_grained {
    s:seatings; g:guestlist;
    if { s.wrt == g.url; }
    negative { s -:dependsOn-> g; }
    modify {
      s -d:dependsOn-> g;
      eval { d.via = { "url" }; }
    }
  }
  rule interlink_fine_grained {
    s:seat; p:person;
    if { s.person == p.path; }
    negative { s-:dependsOn->p;  }
    modify {
      s-d:dependsOn->p;
      eval { d.via = { "confirmed" }; }
    }
  }
  /* @todo consider link type
   */
//  rule ripple_any {
//    p:Infom-:childOf->; d:Infom-:dependsOn->;
//    if { (p.effect == Effect::local); }
//    if { (d.effect == Effect::none); }
//    independent { :findDependant(p,d); }
//    modify {
//      d-:affectedBy->p;
//      eval { d.effect = Effect::implicit; }
//    }
//  }
  rule ripple_cancelation {
    s:seat-d:dependsOn->p:person;
    if { ("confirmed" in d.via) && (p.confirmed == "false") && (p.effect == Effect::local); }
    if { (s.effect == Effect::none); }
    modify {
      s-:affectedBy->p;
      eval {s.effect = Effect::implicit; }
    }
  }
}
